package org.totoro.patterns.behavior.chain.of.responsebility;


import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 对象形成一个链表，触发operator 方法，就先看自己能不能处理，如果不能处理就调用，持有链表对象的
 * <p>
 * 框架中的过滤器、拦截器，都是基于责任链模式
 *
 * <pre>
 *     <img src="责任链模式.jpg" />
 * </pre>
 */
public class Client {

    public static void main(String[] args) {


        MyHandler h1 = new MyHandler("h1");
        MyHandler h2 = new MyHandler("h2");
        MyHandler h3 = new MyHandler("h3");


        h1.setHandler(h2);
        h2.setHandler(h3);
        h1.operator();

        optimize();

    }

    /**
     * 优化写法
     */
    private static void optimize() {


        MyHandler h1 = new MyHandler("h1", 1);
        MyHandler h2 = new MyHandler("h2");
        MyHandler h3 = new MyHandler("h3", 3);

        // 这一步实际业务开发中，这一步可以通过spring 注入进来
        List<MyHandler> myHandlers = Arrays.asList(h1, h2, h3);

        // 排序后的list
        List<MyHandler> sortd = myHandlers.stream().sorted(Comparator.comparing(MyHandler::sort,
                Comparator.reverseOrder())).collect(Collectors.toList());

        sortd.stream().reduce((e1, e2) -> {
            e1.setHandler(e2);
            return e2;
        });

        MyHandler myHandler = sortd.get(0);

        myHandler.operator();
    }
}
